iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 17
0
自我挑戰組

Codewar 進進出出 JS/Ruby系列 第 17

大人行行好

  • 分享至 

  • xImage
  •  

題目:
(6 級) English beggars
你的任務相當簡單:
你會得到一組陣列和數名乞丐,回傳一個陣列,裡面包含每個乞丐帶回家的總和,假設他們每個人都乖乖排隊,從第一個分發到最後一個。

範例:
[1,2,3,4,5] 分給 2 位乞丐,所以應該回傳 [9,6],第一位拿到 [1,3,5],第二位拿到 [2,4]

一樣的陣列分給 3 位乞丐,則會讓第二位乞丐得到更好的結果:[5,7,3],他們分別會拿到 [1,4][2,5][3]

請注意並非所有乞丐都會拿到等量的"捐助",意思是陣列不需要是 n 的倍數;陣列長度甚至可以更短,這樣子的話,剩下的乞丐們將什麼都拿不到 (0)。


Ruby 解法:

def beggars(values, n)
  # 先準備一個放結果的空陣列 new_arr
  new_arr = []
  
  # 如果參數 n 為 1
  # 直接回傳陣列的總和
  return Array(values.sum) if n == 1
  
  # 依照乞丐的人數依序算出每個人會拿到多少
  n.times do |i|
	
    # 把每位乞丐拿到的結果放進 new_arr 中
    new_arr << values.select.with_index { |num, index|
		
      # 如果是最後一位乞丐 (i 從 0 開始)
      if (i + 1) == n
        # 就把 "index + 1" 能被 n 整除的數字分給他 (index 從 0 開始)
        num if (index + 1) % n == 0
      else
        # 反之則分別將數字分給餘數相對應的乞丐
        num if (index + 1) % n == (i + 1)
      end
			
    # 最後將每位乞丐拿到的數字加總
    }.sum
  end
  
  # 回傳計算後的陣列 new_arr
  new_arr
end

JavaScript 解法:

function beggars(values, n){
  // 先準備一個放結果的空陣列 new_arr
  let new_arr = [];
  
  // 如果參數 n 為 1
  if (n === 1) { 
    // 直接將陣列的總和放進 new_arr 並回傳
    new_arr.push(values.reduce((a, b) => a + b, 0));
    return new_arr;
  }
  
  // 依照乞丐的人數依序算出每個人會拿到多少
  for(let i = 1; i <= n; i++) {
	
    // 把每位乞丐拿到的結果放進 selected 中
    let selected = values.filter((num, index) => {
		
      // 如果是最後一位乞丐 (i 從 0 開始)
      if (i === n) {
        // 就把 "index + 1" 能被 n 整除的數字分給他 (index 從 0 開始)
        if ((index + 1) % n === 0) { return num; }
      } else {
        // 反之則分別將數字分給餘數相對應的乞丐
        if ((index + 1) % n === i) { return num; }
      }
    })
    
    // 最後將每位乞丐拿到的數字加總,並放進陣列 new_arr 中
    new_arr.push(selected.reduce((a, b) => a + b, 0));
  }
  
  // 回傳計算後的陣列 new_arr
  return new_arr;
}

上一篇
Casino
下一篇
有記憶的斐波那契
系列文
Codewar 進進出出 JS/Ruby30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言